package top.hekun.study;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import lombok.Getter;

/**
 * @Author: 贺坤
 * @Date: 2023/6/20 16:46
 */
public class WordHandle {
    /**
     * 是否显示word窗口
     */
    private static Boolean visible = false;
    /**
     * 退出时 是否保存文件
     */
    private static boolean saveOnExit = true;
    /**
     * word 文档程序对象
     */
    private ActiveXComponent word;
    /**
     * 所有word文档集合
     */
    private Dispatch documents;
    /**
     * word文档
     */
    private Dispatch doc;
    /**
     * 选定的范围或插入点
     */
    private Dispatch selection;

    /**
     * 构造器
     *
     * @param visible 为true表示word应用程序可见
     */
    public WordHandle(boolean visible) {
        //word运行程序对象不存在，则创建
        if (word == null) {
            word = new ActiveXComponent("Word.Application");
            word.setProperty("Visible", new Variant(visible));
        }
        if (documents == null) {
            documents = word.getProperty("Documents").toDispatch();

        }
    }

    public static void main(String args[]) throws Exception {
        WordHandle msWordManager = new WordHandle(visible);
        // 创建一个新的文档
        msWordManager.createNewDocument();
        msWordManager.insertText("第一段话\r\n");
        // 将插入到移动到末尾 否则会覆盖
        msWordManager.moveEnd();
        // 插入 222
        msWordManager.insertText("第二段话");
        msWordManager.moveEnd();
        msWordManager.insertText("11\r\n22");

        msWordManager.moveEnd();
        // 插入分页符号
        /**
         * 0 -- 分页符
         * 1 -- 分栏符
         * 2 -- 分节符(下一页)
         * 3 -- 分节符(连续)
         * 4 -- 分节符(偶数页)
         * 5 -- 分节符(奇数页)
         * 6 -- ↓ (不清楚的符号)
         * 7 -- 分页符(先换行后页节)
         * 8 -- 分栏符(先换行后栏节)
         * 9 -- ↓ (不清楚的符号)
         * 10 -- ↓ (不清楚的符号)
         * 11 -- ↓ (不清楚的符号)
         */
        Dispatch.call(msWordManager.selection, "InsertBreak", new Variant(11));
        msWordManager.moveEnd();


        msWordManager.moveEnd();
        msWordManager.insertText("最后一段话");
        // 保存一个新文档
        msWordManager.save("H:\\study-record\\jacod\\src\\main\\java\\top\\hekun\\study\\test01");
        msWordManager.close();
    }

    /**
     * 创建一个新的word文档
     */
    public void createNewDocument() {
        doc = Dispatch.call(documents, "Add").toDispatch();
        selection = Dispatch.get(word, "Selection").toDispatch();
    }


    /**
     * 把插入点移动到文件末尾
     */
    public void moveEnd() {
        if (selection == null) {
            selection = Dispatch.get(word, "Selection").toDispatch();
        }
        Dispatch.call(selection, "EndKey", new Variant(6));
    }


    /**
     * 在当前插入点插入字符串
     *
     * @param newText 要插入的新字符串
     */
    public void insertText(Object newText) {
        Dispatch.put(selection, "Text", newText);
        moveEnd();
    }


    /** */
    /**
     * 文件保存或另存为
     *
     * @param savePath 保存或另存为路径
     */
    public void save(String savePath) {
        Dispatch.call(doc, "SaveAs", new Variant(savePath));
    }

    /** */
    /**
     * 关闭当前word文档
     */
    public void closeDocument() {
        if (doc != null) {
            Dispatch.call(doc, "Save");
            Dispatch.call(doc, "Close", new Variant(saveOnExit));
            doc = null;
        }
    }

    /** */
    /**
     * 关闭全部应用
     */
    public void close() {
        closeDocument();
        if (word != null) {
            Dispatch.call(word, "Quit");
            word = null;
        }
        selection = null;
        documents = null;
    }


}
